package com.wwt.springboot_vue.util;

//web请求日志

import com.alibaba.fastjson.JSONObject;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
//
//@Aspect
//@Component
public class Weblog {
//    创建日志管理工厂
    private final static Logger logger= LoggerFactory.getLogger(Weblog.class);

//    设置切点 1* 返回值  2*任何一个类 3*任何方法  （。。）任何参数
    @Pointcut("execution(* com.wwt.springboot_vue.controller.*.*(..))")
    public void webLog(){

    }

//    在切入点之后，执行方法之前记录

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint){
        ServletRequestAttributes attributes=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

        HttpServletRequest request=attributes.getRequest();
        logger.info("开始记录日志========================");
//        获取请求URL
        logger.info("URL     :{}",request.getRequestURL().toString());
//        获取请求方法
        logger.info("Http method :{}",request.getMethod());
//        获取请求的controller的全路径和执行的方法名称
        logger.info("Class method :{}",joinPoint.getSignature().getDeclaringTypeName(),joinPoint.getSignature().getName());
//        获取请求IP
        logger.info("IP   :{}",request.getRemoteAddr());
//        获取请求参数
        logger.info("Request args :{}",new JSONObject().toJSONString(joinPoint.getArgs()));

    }


//    切入点后执行
    @After("webLog()")
    public void doAfter(){
        logger.info("-------------记录请求日志结束");

    }

//    环绕执行
    @Around("webLog()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        Long startTime=System.currentTimeMillis();
//        回调主方法
        Object result=proceedingJoinPoint.proceed();
        //记录返回值
        logger.info("Response Args   :{}",new JSONObject().toJSONString(result));
//        方法消耗的时间
        logger.info("Time consuming  :{}",System.currentTimeMillis()-startTime);

        return result;
    }
}
